// 校验 token 中间件

module.exports = options => {
    const jwt = require('jsonwebtoken')
    const assert = require('http-assert')
    const AdminUser = require('../models/AdminUser')

    return async (req, res, next) => {
        const token = String(req.headers.authorization || '').split(' ').pop();
        assert(token, 401, '请先登录')// 使用assert断言模块抛出错误，在错误处理中间统一处理
        const { id } = jwt.verify(token, req.app.get('secret'))  // { id: '60d4381fe4423414c06d4615', iat: 1624533501 }
        // req.app 就是 app 实例
        assert(id, 401, '请先登录')// 使用assert断言模块抛出错误，在错误处理中间统一处理
        req.userInfo = await AdminUser.findById(id)  // { _id: 60d4381fe4423414c06d4615, username: 'admin', __v: 0 }
        assert(req.userInfo, 401, '请先登录')// 使用assert断言模块抛出错误，在错误处理中间统一处理
        await next()
    }
}